// GlobalEventManager.ts - 修复回调类型问题
import { _decorator, EventTarget, log } from 'cc';

// 定义回调函数类型
type EventCallback = (arg0?: any, arg1?: any, arg2?: any) => void;

/**
 * 全局事件管理器
 * 用于跨节点、跨场景的事件通信
 */
class GlobalEventManager {
    private eventTarget: EventTarget = new EventTarget();
    private static instance: GlobalEventManager;
    
    // 单例模式，确保全局唯一
    public static get Instance(): GlobalEventManager {
        if (!this.instance) {
            this.instance = new GlobalEventManager();
        }
        return this.instance;
    }
    
    /**
     * 监听事件
     * @param eventName 事件名称
     * @param callback 回调函数
     * @param target 监听目标（用于自动移除监听）
     */
    on(eventName: string, callback: EventCallback, target?: any): void {
        log('监听事件',eventName)
        this.eventTarget.on(eventName, callback, target);
    }
    
    /**
     * 一次性监听（触发后自动移除）
     * @param eventName 事件名称
     * @param callback 回调函数
     * @param target 监听目标
     */
    once(eventName: string, callback: EventCallback, target?: any): void {
        this.eventTarget.once(eventName, callback, target);
    }
    
    /**
     * 发射事件
     * @param eventName 事件名称
     * @param arg0 参数1
     * @param arg1 参数2
     * @param arg2 参数3
     */
    emit(eventName: string, arg0?: any, arg1?: any, arg2?: any): void {
        log('发射事件',eventName)
        this.eventTarget.emit(eventName, arg0, arg1, arg2);
    }
    
    /**
     * 移除事件监听
     * @param eventName 事件名称
     * @param callback 回调函数（可选）
     * @param target 监听目标（可选）
     */
    off(eventName: string, callback?: EventCallback, target?: any): void {
        this.eventTarget.off(eventName, callback, target);
    }
    
    /**
     * 移除指定目标的所有事件监听
     * @param target 要移除监听的目标
     */
    targetOff(target: any): void {
        this.eventTarget.targetOff(target);
    }
}

// 导出单例实例
export const GlobalEvent = GlobalEventManager.Instance;